<%@page import="java.util.Date"%>
<%@page import="skyinline.j2ee.basic.projectv5.dao.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>JSTL : Java Standard Tag Library</title>
</head>
<body>
<h1>JSTL : Java Standard Tag Library</h1>
<h3>개요</h3>
<p>Map이나 List등의 컬렉션 항목 순회하기, 조건에
따라 실행, XML 처리, DB 접근 및 조작등의
일반적인 작업을 처리하는 사용자 정의 태그
라이브러리의 집합</p>
<p>jstl.java.net에서 API, implementation 모두 다운로드
- 2014.01 기준 최신버전은 1.2.1(api), 1.2.2(impl)</p>
<p>다운로드 받은 jar 파일은 WEB-INF/lib에 저장</p>
<p>JSP 페이지에서 JSTL을 사용하려면 taglib 지시문 사용</p>


<h3>구성요소</h3>
<p>core : 변수지원, 흐름제어, URL 관리, 기타등등
				 - 접두사는 c</p>
<p>i18n : 로케일, 메세지/날짜/시간 형식지정
				- 접두사는 fmt</p>
<p>functions : 다양한 문자처리용 함수 - 접두사는 fn</p>
<p>SQL : 다양한 SQL 작업용 라이브러리 - 접두사는 sql</p>
<p>XML : 기본적인 XML 작업용 라이브러리 
				- 접두사는 xml</p>

<h3>core</h3>
<p>out	: 표현식을 평가하고 결과를 JspWriter로 출력 <br />
		JSP 2.x 이상에서는 $&#123; } 를 더 많이 사용<br />
		변수값을 xml escaping 해야 하는 경우
		여전히 out 태그를 사용함 (XSS 공격 방지)</p>
<p>set : 문자열 생성 및 유효범위내 변수 생성</p>
<p>remove : 변수 제거시 사용</p>

<p>if : </p>
<p>choose, when, default : </p>

<p>forEach : 반복 실행 또는 컬렉션을 순회 <br />
	  forEach 태그는 코드를 정해진 횟수만큼
	  반복해서 실행하거나 객체 컬렉션을 
	  순회하는데 사용<br />
	  var : 이 속성으로 만들어진 변수는 
	          forEach가 실행중일때에만 유효함<br />
	          즉, forEach가 끝나면 이 변수는 소멸됨<br />
	  varStatus 속성에는 count, last       <br />
	  forEach는 중첩이 가능</p>

<h3>형식화 태그</h3>
<p>formatDate</p>
<p>formatTime</p>
<p>parseNumber</p>
<p>parseDate</p>

<h3>함수 태그</h3>
<p>length</p>
<p>substring</p>
<p>indexOf</p>
<p>escapeXml</p>
<p>startsWith</p>
<p>endsWith</p>
<p>contains</p>
<p>split</p>


<hr />
	<p> <c:out value="아아아앙" /> </p>
	<p> <c:out value="${ param.msg }" 
						default="우우우우" /> </p>
	<p> <c:out value="${ param.msg }" 
			escapeXml="false">우우우우</c:out> </p>
		<!-- 11JSTL.jsp?msg=<script>
						while(true){alert('우어어어');}
						</script>-->
	<p> <c:set var="uid" value="zzyzzy" /> : ${ uid } </p>
	<p> <c:set var="pwd">123456</c:set> : ${ pwd }  </p>
	<p> <jsp:useBean id="b" 
	class="skyinline.j2ee.basic.projectv5.model.BoardVO" />
		<c:set target="${b}" property="title">abcdef</c:set>
		${b.title}
	 </p>
	<p> <c:remove var="uid" /> <c:remove var="pwd" />
		${uid} / ${pwd} </p>
	<hr />	
	<p> <c:if test="${ param.uid eq 'zzyzzy'
	  				and param.pwd eq '123456' }">
			로그인에 성공했습니다~~!
			</c:if>
			<c:if test="${ param.uid ne 'zzyzzy'
						or param.pwd ne '123456' }">
			<h3 style="color:red">로그인에 실패했습니다~~!</h3>
			</c:if> </p>
	<p> ${ ( param.uid eq 'zzyzzy' 
						and param.pwd eq '123456' ) ? 
						"로그인 성공!" : "로그인 실패!" }  </p>
	<p>
			<c:choose>
				<c:when test="${ param.type eq 'member' }">정회원입니다</c:when>
				<c:when test="${ param.type eq 'guest' }">손님입니다</c:when>
				<c:otherwise>등록하세요</c:otherwise>
			</c:choose>
			<!--  ?uid=zzyzzy&pwd=123456 -->
	</p>
	<hr />
	<p>
		<!-- for(int i = 0; i < 10; ++i) { } -->
		<c:forEach var="i" begin="1" 
			end="10" step="1"> ${i} </c:forEach>
		<br />	
		<c:forEach var="b" 
			items="<%=BoardDAO.listBoard() %>">
			${b.uid}/${b.title}/${b.uid}
		</c:forEach>	
		<br />
		<c:forTokens var="item" delims="," 
			items="a,b,c,d,e,1,2,3,4,5"> ${item}
			</c:forTokens>	
	</p>
	<hr />
	<p><fmt:formatNumber value="12" type="number" />
		<fmt:formatNumber value="12" 
			type="number" minIntegerDigits="3" />
		<fmt:formatNumber value="12" 
			type="number" minFractionDigits="2" />			
		<fmt:formatNumber value="12.345" 
			type="number" minFractionDigits="2" />			
	</p>
	<p>
		<fmt:formatNumber value="123.4567"
			pattern=".00" />
		<fmt:formatNumber value="12345.67"
			pattern="#,##00.0#" />
		<fmt:formatNumber value="123.40"
			pattern="#,##00.0#" /> 		 	 
		<fmt:formatNumber value="0123.40"
			pattern="#,##00.00" /> 	
	</p>
	<p><fmt:formatNumber value="123.40"
			type="currency" /> 
		<fmt:formatNumber value="0.314"
			type="percent" />	</p>
	<hr />
	<%-- <% Date now = new Date(); %> --%>
	<jsp:useBean id="now" class="java.util.Date" />		
	<p>[<fmt:formatDate value="${now}" />]
		[<fmt:formatDate value="${now}" 
				dateStyle="short" />]
		[<fmt:formatDate value="${now}" 
				dateStyle="medium" />]
		[<fmt:formatDate value="${now}" 
				dateStyle="long" />]
		[<fmt:formatDate value="${now}" 
				dateStyle="full" />]			
	</p>
	<p>[<fmt:formatDate value="${now}" 
				type="time" />]
		[<fmt:formatDate value="${now}" 
				type="time" timeStyle="short" />]
		[<fmt:formatDate value="${now}" 
				type="time" timeStyle="medium" />]	
		[<fmt:formatDate value="${now}" 
				type="time" timeStyle="long" />]	
		[<fmt:formatDate value="${now}" 
				type="time" timeStyle="full" />]														
	</p>
	<p>[<fmt:formatDate value="${now}" 
				type="both" timeStyle="long"
				dateStyle="full"  />]
		[<fmt:formatDate value="${now}" 
				type="both" timeStyle="medium"
				dateStyle="medium"  />]		
				</p>
	<p><fmt:formatDate value="${now}" 
				type="both" pattern="yyyy-MM-dd" />
		<fmt:formatDate value="${now}" 
				type="both" pattern="a hh:mm" />	</p>
	<hr />			
	<p> <fmt:parseNumber var="no" 
			type="number" value="${param.no}" />
			${ no } </p>
			<!-- ?uid=zzyzzy&pwd=123456&no=987 -->
	<p> <fmt:parseDate var="today"
			type="date" value="${param.today}"
			pattern="yyyy-MM-dd" />${today} <br />
			<fmt:formatDate value="${today}" 
				dateStyle="long" /></p>
			<!-- ?no=987&today=2014-01-10 -->
	<hr />
		<c:set var="jumin" value="123456-1234567" />		
		<c:set var="html" value="<h1>Hello, JSTL!</h1>" />		
		<c:set var="tokens" value="1,2,3,4,5,6,7" />	
	<p>
		jumin의 총 문자수 : ${ fn:length( jumin ) }<br />
		html의 총 문자수  : ${ fn:length( html ) }<br />
		tokens의 총 문자수 : ${ fn:length( tokens ) }<br />
	</p>
	<p>
		성별체크 : ${ fn:substring( jumin, 7, 8 ) } <br />
		생년월일 :	${ fn:substring( jumin, 0, 6) }
		</p>
	<p>
		'-' 문자가 포함된 위치 : ${ fn:indexOf( jumin, '-' ) }
	</p>
	<p>
		escaping 안된 태그 : ${ html } 
		escaping 된 태그 : ${ fn:escapeXml( html ) }
	</p>
	<p>
		'1' 이라는 문자로 시작하는가? : 
				${ fn:startsWith( tokens, '1' ) } <br/>
		'7' 이라는 문자로 끝나는가? :
				${ fn:endsWith( tokens, '7' ) } <br/>
	</p>
	<p>
		'5' 라는 문자가 있는가? :
			${ fn:contains( tokens, '5' ) }
	</p>
	<p>
		${ fn:split( tokens, ',') } <br />
		<c:forEach var="t" 
			items="${ fn:split( tokens, ',' ) }"> 
		${t} </c:forEach>
	</p>
















</body>
</html>